--with Ada.Real_Time;
with LOG;
use  LOG;
--use Ada.Real_Time;

package body ZAPATERIA is

   task body EMPLEADO is
      num : Integer ;
      it : Item ;
      seg: Integer ;

   begin
      accept Trabajar (n: in Integer; segundos: in Integer ) do
         num := n;
         seg := segundos;
      end Trabajar;

      loop
         LOG.Logear("Empleado " & Integer'Image (num) & " busca zapatos" );
         ALMACEN.Sacar ( it ) ;
         LOG.Logear("Empleado " & Integer'Image (num) & " arreglando... ["
           & " dir: " & direccion'image (it.dir) & ", zap: " & zapatos'image(it.zap) & "]");
         delay Duration(seg);--5.0; -- aca va "seg".
         it.salida := clock;--termina de reparalo.
         LOG.Logear("Empleado " & Integer'Image (num) & " termina");

      end loop;
   end EMPLEADO;

   task body ALMACEN is
   begin
      LOG.Logear ("Almacen abierto");
      loop
         select
            when cantidad < MAX =>
               accept Agregar (T: in Item) do
                  Deposito (i) := T ;
               end;

               i:= i mod MAX + 1;
               cantidad := cantidad + 1;
               --LOG.Logear ("Cantidad = " & Integer'Image (cantidad)& "( I = " & Integer'Image (i) & ")");
         or
            when cantidad > 0 =>
               accept Sacar (T: out Item) do
                  T:= Deposito (j);
               end;

               j:= j mod MAX + 1;
               cantidad := cantidad - 1 ;
               --LOG.Logear ("Cantidad = " & Integer'Image (cantidad) & "( J = " & Integer'Image (j) & ")");
         or
            terminate;

         end select;
      end loop;
      LOG.Logear ("Almacen cerrado");

   end ALMACEN;

   procedure Arreglar( D: in direccion; Z: in zapatos) is
      it : Item  ;

   begin
      it.dir  := D;
      it.zap  := Z;
      it.entrada := clock;

      LOG.Logear (">> Encargado recibe zapato nro: " & zapatos'image(Z) & ". dir: " & direccion'image(D) );
      ALMACEN.Agregar (it);
      delay 1.0 ;
      --LOG.Logear ("Encargado agrego zapatos");

   end Arreglar;

   procedure SetArchivoLog (str : String ) is
   begin
      LOG.Archivo (str);
   end;
begin

   for I in empleados'Range loop
      empleados(i).Trabajar (i,i);
   end loop;

end ZAPATERIA;
